package m

import (
	"GameServer/Game/cache"
	"GameServer/Game/dbmodule"
	"GameServer/Game/errors"

	"github.com/globalsign/mgo/bson"
	log "github.com/sirupsen/logrus"
)

// 支付订单信息
type PayOrder struct {
	BaseM
	Uid       bson.ObjectId `bson:"_id" json:"_id"`
	OrderTime int64         `bson:"orderTime" json:"orderTime"` // 订单时间

	MasterName  string  `bson:"masterName" json:"masterName"`   // 渠道商名称
	MasterId    string  `bson:"masterId" json:"masterId"`       // 渠道商id
	OrderId     string  `bson:"orderId" json:"orderId"`         // 订单id
	RoleId      string  `bson:"roleId" json:"roleId"`           // 角色id
	ServerId    string  `bson:"serverId" json:"serverId"`       // 服务器id
	AccountId   string  `bson:"accountId" json:"accountId"`     // 用户id
	ProductId   string  `bson:"productId" json:"productId"`     // 产品id
	Amount      float64 `bson:"amount" json:"amount"`           // 产品金额
	IsRepair    bool    `bson:"isRepair" json:"isRepair"`       // 是否为补单
	Extension   string  `bson:"extension" json:"extension"`     // 透传字段
	OrderStatus string  `bson:"orderStatus" json:"orderStatus"` // 订单状态 'S'代表订单支付成功， 'F'代表失败
}

// 支付订单信息：创建
func NewPayOrder() cache.EntryI {
	return &PayOrder{}
}

// 支付订单信息：保存信息
func (po *PayOrder) Save() (err error) {
	err = dbmodule.MgoDB.GameDB.Upsert("PayOrder", bson.M{"_id": po.Uid}, po)
	return
}

// 支付订单信息：加载
func (po *PayOrder) Load(key interface{}) (err error) {
	switch key.(type) {
	case string:
		if key.(string) == "" {
			return errors.New("无效的key load, key empty")
		}
		po.Uid = bson.ObjectIdHex(key.(string))
	case bson.ObjectId:
		po.Uid = key.(bson.ObjectId)
	default:
		log.WithFields(log.Fields{
			"method": "PayOrder_Load",
			"data":   key,
		}).Error("无效的key load")
		return errors.New("无效的key load")
	}
	return po.LoadData()
}

// 支付订单信息：加载数据
func (po *PayOrder) LoadData() (err error) {
	err = dbmodule.MgoDB.GameDB.FindOne("PayOrder", bson.M{"_id": po.Uid}, nil, &po)
	if err != nil {
		if err.Error() == "not found" {
			return nil
		}
		return
	}
	return
}

// 支付订单信息：更新数据
func (po *PayOrder) Update(val *PayOrder) {
	Cache.Put("PayOrder", val.Uid.Hex(), val)
	val.UpdateData()
}
